package view;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

/**
 * Classe qui permet d'ajouter des infosBulle aux composant de la GUI lorsque la souris passe dessus
 * Elle implémente MouseListener
 * @author Julien
 */
public class MouseOverHintManager implements MouseListener
{
  private Map hintMap;
  private JLabel hintLabel;
  private JTextArea jta;

  /**
   * Constructeur de la classe
   * @param hintLabel
   * @param jta JTextArea dans laquelle se trouvera l'infosBulle.
   */
  public MouseOverHintManager( JLabel hintLabel , JTextArea jta)
  {
    hintMap = new WeakHashMap();
    this.hintLabel = hintLabel;
    this.jta = jta;
  }

  /**
   * fonction d'ajout d'une infobulle pour un composant
   * @param comp Component pour lequel on souhaite avoir une infobulle
   * @param hintText message (strijng) a afficher dans le composant
   */
  public void addHintFor( Component comp, String hintText )
  {
    hintMap.put( comp, hintText );
  }

  /**
   * Fonction d'activation de l'infobulle pour un composant
   * @param comp Composant qui active l'infobulle.
   */
  public void enableHints( Component comp )
  {
    comp.addMouseListener( this );
    if ( comp instanceof Container )
    {
      Component[] components = ((Container)comp).getComponents();
      for ( int i=0; i<components.length; i++ )
       enableHints( components[i] );
    }
    if ( comp instanceof MenuElement )
    {
      MenuElement[] elements = ((MenuElement)comp).getSubElements();
      for ( int i=0; i<elements.length; i++ )
       enableHints( elements[i].getComponent() );
    }
  }

  /**
   * Fonction de récupération de recuperation de l'infobulle pour le composant en paramètre
   * @param comp composant pour lequel on souhaite recuperer l'infobulle
   * @return l'infobulle du composant en paramètre
   */
  private String getHintFor( Component comp )
  {
    String hint = (String)hintMap.get(comp);
    if ( hint == null )
    {
      if ( comp instanceof JLabel )
       hint = (String)hintMap.get(((JLabel)comp).getLabelFor());
      else if ( comp instanceof JTableHeader )
       hint = (String)hintMap.get(((JTableHeader)comp).getTable());
    }
    return hint;
  }

  /**
   * Fonction qui affiche l'infobulle du composant sur lequel on est passé (qui a déclenché l'evenement) dans la JTextArea de la classe
   * @param e evenement de souris, qui a été produit par le composant sur lequel on est passé.
   */
  public void mouseEntered( MouseEvent e )
  {
    Component comp = (Component)e.getSource();
    String hint;
    do
    {
      hint = getHintFor(comp);
      comp = comp.getParent();
    }
    while ( (hint == null) && (comp != null) );
    if ( hint != null )
      hintLabel.setText( hint );
      jta.setText(hint);
  }

  /**
   * Fonction qui enleve l'infoBulle car on sort d'un composant !
   * @param e evenement de souris, qui a été produit par le composant duquel on est sorti avec le curseur.
   */
  public void mouseExited( MouseEvent e )
  {
    hintLabel.setText("");
    jta.setText("");
  }

  public void mouseClicked( MouseEvent e ) {}
  public void mousePressed( MouseEvent e ) {}
  public void mouseReleased( MouseEvent e ) {}
}